package org.Thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyThread_Demo6 extends Thread{
    //保证所有线程共享同一个计数器对象
    static int ticket=1;
    //Lock在Java中，lock()是java.util.concurrent.locks.Lock接口提供的方法，用于实现比synchronized更灵活的线程同步机制。
    //lock()方法用于获取锁，如果锁已被其他线程获取，则当前线程会被阻塞，直到获取到锁为止。
    //unlock()方法用于释放锁，调用该方法的线程必须是获取到锁的线程，否则会抛出IllegalMonitorStateException异常。
    //使用Lock接口可以避免死锁问题，因为它提供了一种更细粒度的锁控制机制。
    static Lock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            //锁对象唯一 这意味着所有MyThead_Demo6类的实例将共享同一把锁，确保整个卖票过程的线程安全
            //锁在循环里面 确保每次只有一个线程进入临界区
           // synchronized (MyThread_Demo6.class) {
            lock.lock();
            try {
                if (ticket <=100) {
                     //lock.lock();
                     ticket++;
                     System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                 }else {
                     break;
                 }
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
            // }
        }
    }
}
